import os
from PIL import Image  

def extract_frames(gif_path:str,save_mode:str):  
    """  
    提取GIF中的每一帧,并将其保存为PNG/BMP文件。  
      
    参数:  
    gif_path: GIF文件的路径。  
    save_mode: 保存模式，可选值为"png"或"bmp"
    """  
    if gif_path == '':
        return -1
    
    if save_mode == "png":
        img_type = "_png"
    elif save_mode == "bmp":
        img_type = "_bmp"
    try:
        output_folder = f"{os.path.splitext(gif_path)[0]}{img_type}(1)" 
        try:
            os.makedirs(f"{output_folder}")  
        except:
            count = 1
            #检查文件夹是否存在，不存在退出
            while os.path.exists(output_folder):
                output_folder = f"{output_folder[:-3]}({count})"#去除最后三个字符以保证()内数字为最新
                count += 1
            os.makedirs(output_folder)  
        with Image.open(gif_path) as img:                       # 打开GIF文件  
            for frame_number in range(img.n_frames):            # 遍历GIF中的每一帧  
                img.seek(frame_number)                          # 提取当前帧  
                frame_filename = f"{frame_number + 1}.{save_mode}"      # 为当前帧创建一个唯一的文件名 
                frame_path = os.path.join(output_folder, frame_filename)  # 构建输出文件路径
                img.save(frame_path)                            # 保存当前帧到文件  
    except:pass

if __name__ == "__main__":
    gif_path = "待转换图片\\giphy.gif"
    extract_frames(gif_path)
